home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / foomatic-compiledb < prev    next >
Text File  |  2009-09-18  |  5KB  |  191 lines

  1. #!/usr/bin/perl
  2. # -*- perl -*-
  3.  
  4. use Foomatic::Defaults;
  5. use Foomatic::DB;
  6. use Cwd;
  7.  
  8. my ($db) = new Foomatic::DB;
  9.  
  10. use Getopt::Std;
  11. getopts('ft:j:hd:') || help();
  12. my $force = ($opt_f ? 1 : 0);
  13. my $debug = 0;
  14.  
  15. # Do the whole world
  16.  
  17. sub help {
  18.     print STDERR <<EOF;
  19. compile_db [ -f ] [ -t type ] [ -d destdir] [ -j n ] [driver1] [driver2] ...
  20.  -f       force: proceed even if the destination directory exists
  21.  -t type  output file type: ppd or xml
  22.  -j n     n==number of work processes to run at the same time
  23.  -d destdir  put PPD files in this directory
  24.  driver1 driver2 ...  
  25.           only compile the database for these drivers
  26. EOF
  27.  
  28.     exit 1;
  29. }
  30.  
  31. help() if ($opt_h);
  32.  
  33. # Default file type are PPD files
  34. if (!$opt_t) {
  35.     $opt_t = "ppd";
  36. }
  37. my $destdir;
  38. if( $opt_d ){
  39.     $destdir = $opt_d;
  40. }
  41.  
  42. print STDERR "\n";
  43. # Destination directory
  44. my $pwd = cwd;
  45.  
  46. if (($opt_t eq "ppd") || ($opt_t eq "cups") || ($opt_t eq "ppr")) {
  47.     # Generic PPDs
  48.     $filetype = "ppd";
  49.     $destdir = "$pwd/ppd" if not defined( $destdir );
  50.     $suffix = ".ppd";
  51.     print STDERR "Generating Foomatic PPD files ...\n";
  52. } elsif ($opt_t eq "xml") {
  53.     $filetype = "xml";
  54.     $destdir = "$pwd/combo-xml" if not defined( $destdir );
  55.     $suffix = ".xml";
  56.     print STDERR "Generating Foomatic printer/driver combo XML files ...\n";
  57. } else {
  58.     die "Unknown file type: $opt_t!\n";
  59. }
  60.  
  61. print STDERR "\nStoring files in directory $destdir.\n";
  62. mkdir $destdir, 0777 or $force or die "\nCannot make destination directory (If the directory already exists and you\nwant to proceed anyway, use the \"-f\" option)!\n";
  63.  
  64. # Compute the overview (only printer/driver combos which give a PPD)
  65. $db->get_overview(1, ($filetype eq "ppd" ? 2 : 0));
  66.  
  67. # Find all printer/driver combinations
  68. my @combos;
  69. for my $printer (@{$db->{"overview"}}) {
  70.     my $poid = $printer->{'id'};
  71.     for my $driver (@{$printer->{'drivers'}}) {
  72.     if (!@ARGV || Foomatic::DB::member($driver, @ARGV)) {
  73.         push (@combos, "$poid,$driver\n");
  74.     }
  75.     }
  76. }
  77.  
  78. # OK, spawn n manager processes
  79. # create lists to process
  80. $opt_j = 0 if( not defined $opt_j );
  81. $opt_j += 0;
  82. $opt_j = 1 if( not $opt_j or $opt_j < 0 );
  83.  
  84. my $n = 0;
  85. my $rcombos = [];
  86. my @rcombos;
  87. for( $n = 0; $n < $opt_j; ++$n ){
  88.     $rcombos->[$n] = [];
  89. }
  90. $n = 0;
  91. while( @combos ){
  92.     my $pos = int(rand(scalar(@combos)));
  93.     my $j = $n % $opt_j;
  94.     print "$n: combos " . scalar(@combos) . ", pos $pos, id $j\n" if $debug;
  95.     push( @{$rcombos->[$n % $opt_j]}, splice( @combos, $pos, 1 ) );
  96.     ++$n;
  97. }
  98. my (@pids, $pid );
  99. for( $n = 0; $n < $opt_j; ++$n ){
  100.     $pid = fork();
  101.     if( ! defined( $pid ) ){
  102.     warn( "cannot fork child process" );
  103.     break;
  104.     } elsif( ! $pid ){
  105.         # Child, go on immediately
  106.     @rcombos = @{$rcombos->[$n]};
  107.         last;
  108.     }
  109.     print "process $pid\n" if $debug;
  110. }
  111. if( $pid ){
  112.     # we wait for the processes
  113.     while( ($pid = wait()) > 0 ){ print "DONE $pid\n" if $debug };
  114.     print "ALL DONE" if $debug;
  115. }
  116.  
  117. print "Monitor process $$\n";
  118.  
  119. # Now, the processing loop:
  120. my $combo;
  121. my $pcount=0;
  122. my $fileh=spawn_child();
  123. while($combo=pop(@rcombos)) {
  124.     print "PROCESS $n - $$, $combo" if $debug;;
  125.     print $fileh $combo;
  126.     if ($pcount++ > 25) {
  127.     close $fileh or die "\nError in child...\n";
  128.     $fileh = spawn_child();
  129.     $pcount=0;
  130.     }
  131. }
  132. close $fileh;
  133.  
  134. print STDERR "Done.\n";
  135.  
  136. exit (0);
  137.  
  138. # Form a combo-computing child process to handle a flock of combos
  139. sub spawn_child {
  140.     if (open CHILD, '|-') {
  141.     return \*CHILD;
  142.     } else {
  143.     while ($line=<STDIN>) {
  144.  
  145.         my ($printer,$driver) = split(',',$line);
  146.         chomp $driver;
  147.  
  148.         # Determine file name for the output file
  149.         my $printer = Foomatic::DB::translate_printer_id($printer);
  150.         my $filename = "$destdir/$printer-$driver$suffix";
  151.  
  152.         # Skip on bad file name
  153.         if ($filename =~ /^\-/) {
  154.         print STDERR "WARNING: $printer with $driver gives a bad PPD file name: $filename\n\n";
  155.         next;
  156.         }
  157.  
  158.         # Skip on non-existing printer XML file (happens if in the
  159.         # list of supported printers of a driver is a printer
  160.         # which does not exist in the Foomatic database)
  161.         next if !defined($db->get_printer($printer));
  162.  
  163.         ## Skip entirely if we can
  164.         #next if (-f $filename);
  165.         
  166.         print STDERR "  Worker $$ ...printer $printer, driver $driver\n";
  167.         
  168.         # Generate the file ...
  169.         if ($filetype eq 'xml') {
  170.         @data = $db->get_combo_data_xml($driver, $printer);
  171.         } else {
  172.         my $possible = $db->getdat($driver, $printer);
  173.         # Do not create a PPD file if the printer/driver combo
  174.         # is not possible or if the renderer command line is
  175.         # empty and no custom PPD file is available
  176.         next if ((!$possible) or 
  177.              ((!$db->{'dat'}{'cmd'}) and 
  178.               (!$db->{'dat'}{'ppdfile'})));
  179.         @data = $db->getppd();
  180.         }
  181.         open OUTPUT, "> $filename" ||
  182.         die "Cannot write $filename!";
  183.         print OUTPUT join('', @data);
  184.         close OUTPUT;
  185.     }
  186.  
  187.     # No more input!
  188.     exit (0);
  189.     }    
  190. }
  191.